Availability data -- France¶

This page was generated from notebook Models/Basic_France_model/Production/Production_visualisation_and_analysis.ipynb with nbconvert

This file contains visualisation of availability time series for Nuke, Wind Power, PV and other production means.

If you're lost, you can go back to

  • one node model README it gives planing tools and consumption models
  • two node models README for step by step learning with two nodes (France and Germany).
  • Mode complete 7 node model README for a more complete European model to do prospective analysis

Table of Contents¶

  • 1. Availability data set in France
    • 1.1 Nuke
    • 1.2 Wind Power
    • 1.3 PV
  • 2. Building new datasets
    • 2.1 More data From Eco2Mix
    • 2.2 More Nuke data
    • 2.3 More data From RTE availability
    • 2.4 Exemple for building a new testcase

This notebook gives a detailed explanation of the code contained in input-Availability.py.

Availability $a_{it}$ at time $t$ for a production mean $i$ is defined as the ratio between maximum possible production and installed power. As a consequence, $\forall i,t$ we have $a_{it}\in [0,1]$.

In this notebook, you will manipulate availability time series, together with models of availability for nuclear, PV and wind power. Note that what is called availability for wind power and solar power is the same as instantaneous capacity factor

In [1]:
import os
import sys
if os.path.basename(os.getcwd())=='Production':
    sys.path.append('../../../')

InputFolder='Data/'

#region importation of modules
import numpy as np
import pandas as pd
import seaborn as sns
import csv
import datetime
import copy
import plotly.graph_objects as go
import matplotlib.pyplot as plt

from functions.f_graphicalTools import * #Il faut préciser le chemin où vous avez sauvegardé les données csv
#endregion

1. Availability data set in France ¶

1.1 Nuke ¶

In [2]:
#region Disponibilité sur la France période 2013-2016
Zones="FR"
year=2013

MyTech= 'OldNuke'  ### 'Thermal' 'OldNuke' 'HydroRiver' 'HydroReservoir' 'WindOnShore' 'Solar'
availabilityFactor = pd.read_csv(InputFolder+'availabilityFactor'+str(year)+'_FR.csv',
                                sep=',',decimal='.',skiprows=0,parse_dates=['Date'])
availabilityFactor.loc[:,"TIMESTAMP"]=pd.to_datetime(availabilityFactor.loc[:,"Date"])
tabl=availabilityFactor[availabilityFactor['TECHNOLOGIES']==MyTech]
tabl_ = tabl.reset_index().assign(TIMESTAMP_=range(1, len(tabl) + 1)).drop(
    columns="TIMESTAMP")

fig=MyPlotly(x_df=tabl_.TIMESTAMP_,y_df=tabl[['availabilityFactor']],fill=False)

fig = go.Figure()
fig=fig.add_trace(go.Scatter(x=tabl_['TIMESTAMP_'],y=tabl['availabilityFactor'],line=dict(color="#000000"),name="original"))
for newyear in range(2013,2016):
    availabilityFactor = pd.read_csv(InputFolder + 'availabilityFactor' + str(newyear) + '_' + str(Zones) + '.csv',
                                     sep=',', decimal='.', skiprows=0,parse_dates=['Date'])
    availabilityFactor.loc[:, "TIMESTAMP"] = pd.to_datetime(availabilityFactor.loc[:, "Date"])
    tabl = availabilityFactor[availabilityFactor['TECHNOLOGIES'] == MyTech]
    tabl_ = tabl.reset_index().assign(TIMESTAMP_=range(1, len(tabl) + 1)).drop(
        columns="TIMESTAMP")
    fig.add_trace(go.Scatter(x=tabl_['TIMESTAMP_'],y=tabl['availabilityFactor'],
                             line=dict(color="#9CA2A8",width=1),
                             name=newyear))
fig.show()
#plotly.offline.plot(fig, filename='file.html')
#endregion

1.2 Wind Power ¶

In [3]:
#region la même chose mais avec l'éolien
Zones="FR"
year=2013

MyTech= 'WindOnShore'  ### 'Thermal' 'OldNuke' 'HydroRiver' 'HydroReservoir' 'WindOnShore' 'Solar'
availabilityFactor = pd.read_csv(InputFolder+'availabilityFactor'+str(year)+'_FR.csv',
                                sep=',',decimal='.',skiprows=0,parse_dates=['Date'])
availabilityFactor.loc[:,"TIMESTAMP"]=pd.to_datetime(availabilityFactor.loc[:,"Date"])
tabl=availabilityFactor[availabilityFactor['TECHNOLOGIES']==MyTech]
tabl_ = tabl.reset_index().assign(TIMESTAMP_=range(1, len(tabl) + 1)).drop(
    columns="TIMESTAMP")

fig=MyPlotly(x_df=tabl_.TIMESTAMP_,y_df=tabl[['availabilityFactor']],fill=False)

fig = go.Figure()
fig=fig.add_trace(go.Scatter(x=tabl_['TIMESTAMP_'],y=tabl['availabilityFactor'],line=dict(color="#000000"),name="original"))
for newyear in range(2013,2016):
    availabilityFactor = pd.read_csv(InputFolder + 'availabilityFactor' + str(newyear) + '_' + str(Zones) + '.csv',
                                     sep=',', decimal='.', skiprows=0,parse_dates=['Date'])
    availabilityFactor.loc[:, "TIMESTAMP"] = pd.to_datetime(availabilityFactor.loc[:, "Date"])
    tabl = availabilityFactor[availabilityFactor['TECHNOLOGIES'] == MyTech]
    tabl_ = tabl.reset_index().assign(TIMESTAMP_=range(1, len(tabl) + 1)).drop(
        columns="TIMESTAMP")
    fig.add_trace(go.Scatter(x=tabl_['TIMESTAMP_'],y=tabl['availabilityFactor'],
                             line=dict(color="#9CA2A8",width=1),
                             name=newyear))
fig.show()
#plotly.offline.plot(fig, filename='file.html')
#endregion

1.3 PV ¶

In [4]:
#region la même chose mais avec le PV
Zones="FR"
year=2013

MyTech= 'Solar'  ### 'Thermal' 'OldNuke' 'HydroRiver' 'HydroReservoir' 'WindOnShore' 'Solar'
availabilityFactor = pd.read_csv(InputFolder+'availabilityFactor'+str(year)+'_FR.csv',
                                sep=',',decimal='.',skiprows=0,parse_dates=['Date'])
availabilityFactor.loc[:,"TIMESTAMP"]=pd.to_datetime(availabilityFactor.loc[:,"Date"])
tabl=availabilityFactor[availabilityFactor['TECHNOLOGIES']==MyTech]
tabl_ = tabl.reset_index().assign(TIMESTAMP_=range(1, len(tabl) + 1)).drop(
    columns="TIMESTAMP")

fig=MyPlotly(x_df=tabl_.TIMESTAMP_,y_df=tabl[['availabilityFactor']],fill=False)

fig = go.Figure()
fig=fig.add_trace(go.Scatter(x=tabl_['TIMESTAMP_'],y=tabl['availabilityFactor'],line=dict(color="#000000"),name="original"))
for newyear in range(2013,2016):
    availabilityFactor = pd.read_csv(InputFolder + 'availabilityFactor' + str(newyear) + '_' + str(Zones) + '.csv',
                                     sep=',', decimal='.', skiprows=0,parse_dates=['Date'])
    availabilityFactor.loc[:, "TIMESTAMP"] = pd.to_datetime(availabilityFactor.loc[:, "Date"])
    tabl = availabilityFactor[availabilityFactor['TECHNOLOGIES'] == MyTech]
    tabl_ = tabl.reset_index().assign(TIMESTAMP_=range(1, len(tabl) + 1)).drop(
        columns="TIMESTAMP")
    fig.add_trace(go.Scatter(x=tabl_['TIMESTAMP_'],y=tabl['availabilityFactor'],
                             line=dict(color="#9CA2A8",width=1),
                             name=newyear))
fig.show()
#plotly.offline.plot(fig, filename='file.html')
#endregion

2. Building new datasets ¶

2.1 More data From RTE ¶

ECO2MIX Le site de RTE et la page de téléchargement

In [5]:
#region more data from eco2Mix 2012-2019
Eco2mix = pd.read_csv(InputFolder+'Eco2Mix_Hourly_National_xts.csv',
                                sep=';',decimal=',',skiprows=0,
                      dtype={'Index':str, 'Consommation':np.float64, 'Prevision.J1':np.float64, 'Prevision.J':np.float64, 'Fioul':np.float64,
       'Charbon':np.float64, 'Gaz':np.float64, 'Nucleaire':np.float64, 'Eolien':np.float64, 'Solaire':np.float64, 'Hydraulique':np.float64,
       'Pompage':np.float64, 'Bioenergies':np.float64, 'Ech.physiques':np.float64, 'Taux.de.Co2':np.float64,
       'Ech.comm.Angleterre':np.float64, 'Ech.comm.Espagne':np.float64, 'Ech.comm.Italie':np.float64,
       'Ech.comm.Suisse':np.float64, 'Ech.comm.AllemagneBelgique':np.float64, 'Fioul..TAC':np.float64,
       'Fioul..Cogen':np.float64, 'Fioul..Autres':np.float64, 'Gaz..TAC':np.float64, 'Gaz..Cogen':np.float64, 'Gaz..CCG':np.float64,
       'Gaz..Autres':np.float64, 'Hydraulique..Fil.de.leau..eclusee':np.float64, 'Hydraulique..Lacs':np.float64,
       'Hydraulique..STEP.turbinage':np.float64, 'Bioenergies..Dechets':np.float64,
       'Bioenergies..Biomasse':np.float64, 'Bioenergies..Biogaz':np.float64})
Eco2mix['Date'] = pd.to_datetime(Eco2mix['Index'], errors='coerce')
Eco2mix.columns
Eco2mix['year'] = pd.DatetimeIndex(Eco2mix['Date']).year
Eco2mixYear=Eco2mix[Eco2mix['year']==2019]
Hydraulique=Eco2mixYear[['Date','Hydraulique..Lacs','Hydraulique..Fil.de.leau..eclusee']].set_index('Date').rename(
    columns={'Hydraulique..Fil.de.leau..eclusee':'HydroRiver','Hydraulique..Lacs':'HydroLake'})
Hydraulique.max()

Hydraulique.HydroLake.sum()/7000
#endregion
Out[5]:
2053.9869523809525

Donnes régionales sont mises à jour sur une interface plus simple à utiliser ici. Si quelqu'un veut produire un cas avec les régions Françaises ce serait très intéressant !

2.2 more Nuke Availability ¶

In [6]:
#region more nuke availability for France
DispoNukeTotal = pd.read_csv(InputFolder+'DispoNukeTotal2007_2017.csv',
                                sep=';',decimal=',',skiprows=0,
                      dtype={'Dates':str, 'Availability':np.float64})
DispoNukeTotal.loc[:,"TIMESTAMP"]=pd.to_datetime(DispoNukeTotal.loc[:,"Dates"])
DispoNukeTotal=DispoNukeTotal.assign(Year=DispoNukeTotal.loc[:,"TIMESTAMP"].dt.year).drop(columns="Dates")


DispoNukeTotal=DispoNukeTotal.assign(Year=DispoNukeTotal.TIMESTAMP.dt.year)
fig = go.Figure()
for newyear in range(2007,2016):
    DispoNukeTotalYear=DispoNukeTotal.loc[DispoNukeTotal.Year==newyear]
    DispoNukeTotal_=DispoNukeTotalYear.reset_index().assign(TIMESTAMP_=range(1,len(DispoNukeTotalYear)+1)).drop(columns="TIMESTAMP")
    fig.add_trace(go.Scatter(x=DispoNukeTotal_['TIMESTAMP_'],y=DispoNukeTotal_['Availability'],
                             line=dict(color="#9CA2A8",width=1),
                             name=newyear))
fig.show()
#plotly.offline.plot(fig, filename='file.html')

#endregion

2.3 More data From other sources ¶

  • ENTSOE Transparency plateform it seems that there is a python client here
  • API RTE There is a R package to access the data. Contribution of RTE to Open data plateform direct download is possible
  • A list of open power system data sets for Europe

2.4 Exemple for building a new testcase ¶